﻿using System;
using System.Collections.Generic;

namespace Models
{
    public class FrontendDataAccess : DataAccessBase
    {

        #region Creation

        public FrontendDataAccess(DataAccessConnection state = DataAccessConnection.Closed) : base(state)
        {

        }

        #endregion

        #region Getter methods

        public IEnumerable<Color> AllColors()
        {
            command.Parameters.Clear();
            command.CommandText = "SP_GetAllColors";

            using (var reader = command.ExecuteReader())
            {
                while (reader.Read())
                {
                    yield return new Color
                    (
                        name: (String)reader["Color"],
                        id: (Int32)reader["Id"]       
                    );
                }
            }
        }

        public IEnumerable<SizeModel> AllSizes()
        {
            command.Parameters.Clear();
            command.CommandText = "SP_GetAllSizes";

            using (var reader = command.ExecuteReader())
            {
                while (reader.Read())
                {
                    yield return new SizeModel
                    (
                        name: (String)reader["Size"],
                        id: (Int32)reader["Id"]
                    );
                }
            }
        }

        public int GenericItemSearchCount(int colorId,
                                          int brandId, int categoryId, int sizeId,
                                          string query, string material, decimal maxPrice,
                                          int hasImage, string order)
        {
            Console.WriteLine(categoryId);
            Console.WriteLine(brandId);
            command.Parameters.Clear();
            command.CommandText = "SP_ItemSearchCount";
            command.Parameters.AddWithValue("@ColorId", colorId);
            command.Parameters.AddWithValue("@BrandId", brandId);
            command.Parameters.AddWithValue("@CategoryId", categoryId);
            command.Parameters.AddWithValue("@SizeId", sizeId);
            command.Parameters.AddWithValue("@Query", query);
            command.Parameters.AddWithValue("@Material", material);
            command.Parameters.AddWithValue("@MaxPrice", maxPrice);
            command.Parameters.AddWithValue("@HasImage", hasImage);
            command.Parameters.AddWithValue("@OrderBy", order);
            return (int)command.ExecuteScalar();
        }


        /// <summary>
        /// Søger på items baseret på søgekriterier. Hvis du ikke vil søge på et parameter, 
        /// skal det have default(T) value. Offset og Limit er påkrævet.
        /// </summary>
        /// <param name="offset">Offset position i databasen</param>
        /// <param name="limit">Row limit</param>
        /// <param name="colorId">Id på den farve der skal søges på</param>
        /// <param name="brandId">Id på det mærke der skal søges på</param>
        /// <param name="categoryId">Id på den kategori der skal søges på</param>
        /// <param name="sizeId">Id på den størrelse der skal søges på</param>
        /// <param name="query">Fritekst til søgning på item navne</param>
        /// <param name="material">Tekst søgning på materiale</param>
        /// <param name="maxPrice">Max pris</param>
        /// <param name="hasImage">1 hvis søgeresultatet skal indeholde billeder</param>
        /// <param name="order">Den kolonne der skal sorteres på (navn, pris)</param>
        /// <returns>Yield return SearchData objekt</returns>
        public IEnumerable<SearchData> GenericItemSearch(int offset, int limit, int colorId, 
                                                         int brandId, int categoryId, int sizeId, 
                                                         string query, string material, decimal maxPrice, 
                                                         int hasImage, string order)
        {
            command.Parameters.Clear();
            command.CommandText = "SP_ItemSearch";
            command.Parameters.AddWithValue("@Offset", offset);
            command.Parameters.AddWithValue("@Limit", limit);
            command.Parameters.AddWithValue("@ColorId", colorId);
            command.Parameters.AddWithValue("@BrandId", brandId);
            command.Parameters.AddWithValue("@CategoryId", categoryId);
            command.Parameters.AddWithValue("@SizeId", sizeId);
            command.Parameters.AddWithValue("@Query", query);
            command.Parameters.AddWithValue("@Material", material);
            command.Parameters.AddWithValue("@MaxPrice", maxPrice);
            command.Parameters.AddWithValue("@HasImage", hasImage);
            command.Parameters.AddWithValue("@OrderBy", order);

            using (var reader = command.ExecuteReader())
            {
                while (reader.Read())
                {
                    // her tjekker vi på DB null values, i de tilfælde det er muligt

                    string itemDesc = (reader["ItemDescription"] != DBNull.Value)
                                                 ? (String)reader["ItemDescription"]
                                                 : String.Empty;

                    string mat = (reader["Material"] != DBNull.Value)
                                                 ? (String)reader["Material"]
                                                 : String.Empty;

                    byte[] img = (reader["Img"] != DBNull.Value) ? (byte[]) reader["Img"] : null;

                    // returnerer nyt objekt med søgedata
                    yield return new SearchData
                    (
                        genericItemId: (Int32)reader["GenericItemId"],
                        genericItemName: (String)reader["GenericItemName"],
                        brandName: (String)reader["BrandName"],
                        categoryName: (String)reader["CategoryName"],
                        discountPrice: (Decimal)reader["DiscountPrice"],
                        itemDescription: itemDesc,
                        displayName: (String)reader["DisplayName"],
                        material: mat,
                        image: img
                    );
                }
            }
        }

        #endregion

    }
}
